package typeinfo;
import static net.mindview.util.Print.*;

interface Interface {
	void doSomething();
	void somethingElse(String arg);
}

class RealObject implements Interface{

    @Override
	public void doSomething() {
	  print("doSomething");
	}
	@Override
	public void somethingElse(String arg) {
	  print("somethingElse " + arg);
	}	
}

class Real implements Interface{

    @Override
	public void doSomething() {
	  print("doSomething2");
	}
	@Override
	public void somethingElse(String arg) {
	  print("somethingElse2 " + arg);
	}	
}
class SimpleProxy implements Interface {

	private Interface proxied;
	
	public SimpleProxy(Interface proxied) {
		this.proxied = proxied;
	}
	@Override
	public void doSomething() {
		print("SimpleProxy doSomething");
		proxied.doSomething();
	}

	
	@Override
	public void somethingElse(String arg) {
		print("SimpleProxy somethingElse " +arg);
		proxied.somethingElse(arg);
	}
}
public class SimpleProxyDemo {

	public static void consumer(Interface iface) {
		iface.doSomething();
		iface.somethingElse("bonobo");
	}
	
	public static void main(String[] args) {
		consumer(new RealObject());
		consumer(new SimpleProxy(new RealObject()));
	}
}
